//
// Created by PC on 2024/4/29.
//

/*
 * 单词查找树
 * http://ybt.ssoier.cn:8088/problem_show.php?pid=1337
 * 【题目描述】
在进行文法分析的时候，通常需要检测一个单词是否在我们的单词列表里。为了提高查找和定位的速度，通常都画出与单词列表所对应的单词查找树，其特点如下：
1．根结点不包含字母，除根结点外每一个结点都仅包含一个大写英文字母；
2．从根结点到某一结点，路径上经过的字母依次连起来所构成的字母序列，称为该结点对应的单词。单词列表中的每个单词，都是该单词查找树某个结点所对应的单词；
3．在满足上述条件下，该单词查找树的结点数最少。
4．例如图3-2左边的单词列表就对应于右边的单词查找树。注意，对一个确定的单词列表，请统计对应的单词查找树的结点数（包含根结点）。
【输入】
为一个单词列表，每一行仅包含一个单词和一个换行/回车符。每个单词仅由大写的英文字母组成，长度不超过63个字母 。文件总长度不超过32K，至少有一行数据。
【输出】
仅包含一个整数，该整数为单词列表对应的单词查找树的结点数。
【输入样例】
A
AN
ASP
AS
ASC
ASCII
BAS
BASIC
【输出样例】
13
 *
 * */


#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>

using namespace std;

int main()
{
    vector<string> words;
    string s;
//    int n = 8;
    // debug模式不设置断点 输入完按ctrl d 可以结束输入
    while (cin >> s)
//        while (n--)
    {
        words.push_back(s);
    }
    sort(words.begin(), words.end());
    int count=0;
    for (int i = 0; i < words.size()-1; ++i)
    {
        string a0=words[i];
        string a1=words[i+1];
        int a0size = a0.size();
        int a1size = a1.size();
        if (a0size>a1size)
            swap(a0size,a1size);
        count+=(a1size-a0size);
        for (int j = 0; j < a0size ; ++j)
        {
            if(a0[j]!=a1[j])
            {
                ++count;
            }
        }
    }
    cout<<count;
    return 0;
}